package com.bjxst.web.listener;

import com.bjxst.commons.Constants;
import com.bjxst.pojo.Users;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

//解决HttpSession超时，被反复销毁时的异常问题
/*客服端用户登录后，HttpSession会被缓存在servletContext，HttpSession超时,tomcat会销毁HttpSession，
*但servletContext还缓存着HttpSession对象，如果再登录 ，会拿到还在缓存的HttpSession对象，当到了
* 时间，再次销毁HttpSession时，会出现异常，因为这session已经被销毁*/
//当HttpSession销毁之前会启动Listener监听，在Listener中拿到servletContext中的HttpSession对象,把它删除就可以

@WebListener
public class HttpSessionLifecycleListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        //获取ServletContext对象，然后将所对应的HttpSession删除掉
        HttpSession session = se.getSession();
        ServletContext servletContext = session.getServletContext();
        //拿到用户对象
        Users users =(Users) session.getAttribute(Constants.USER_SESSION_KEY);
        //利用Userid，获得要销毁的session对象  双引号是强转为String类型
        servletContext.removeAttribute(users.getUserid()+"");


    }
}
